/**
 * API测试脚本
 * 用于测试后端功能
 */

const axios = require('axios');
const { logInfo, logError } = require('../src/logger');

// API基础URL
const BASE_URL = 'http://localhost:3000';

// 生成随机邮箱和手机号
const randomEmail = `test_${Date.now()}@example.com`;
const randomPhone = `138${Math.floor(10000000 + Math.random() * 90000000)}`;

// 测试用户数据
const testUser = {
  username: 'testuser',
  email: randomEmail,
  password: 'TestPassword123!',
  phone: randomPhone,
  birthDate: '1990-01-01',
  birthTime: '08:30',
  gender: 'male',
  timezone: 'Asia/Shanghai'
};

// 测试梦境内容
const testDream = {
  dreamContent: '我梦见自己在水中游泳，感觉非常自由和轻松。'
};

// 测试八字数据
const testBazi = {
  birthDate: '1990-01-01',
  birthTime: '08:30',
  timezone: 'Asia/Shanghai'
};

// 测试塔罗牌占卜数据
const testTarot = {
  count: 3
};

/**
 * 测试用户注册
 */
async function testUserRegistration() {
  try {
    logInfo('开始测试用户注册...');
    
    // 为每次测试生成唯一的用户数据
    const timestamp = Date.now();
    const uniqueTestUser = {
      ...testUser,
      email: `test_${timestamp}@example.com`,
      username: `testuser_${timestamp}`,
      phone: `138${Math.floor(10000000 + Math.random() * 90000000)}`
    };
    
    const response = await axios.post(`${BASE_URL}/api/users/register`, uniqueTestUser);
    
    if (response.data.success) {
      logInfo('用户注册测试通过', { userId: response.data.data.user.id });
      return response.data.data.token; // 返回令牌用于后续测试
    } else {
      logError('用户注册测试失败', { message: response.data.message });
      return null;
    }
  } catch (error) {
    logError('用户注册测试出错', { error: error.message });
    return null;
  }
}

/**
 * 测试用户登录
 */
async function testUserLogin() {
  try {
    logInfo('开始测试用户登录...');
    
    // 先注册一个新用户
    const timestamp = Date.now();
    const uniqueTestUser = {
      ...testUser,
      email: `test_login_${timestamp}@example.com`,
      username: `testuser_login_${timestamp}`,
      phone: `138${Math.floor(10000000 + Math.random() * 90000000)}`
    };
    
    // 注册用户
    await axios.post(`${BASE_URL}/api/users/register`, uniqueTestUser);
    
    // 使用注册的用户信息登录
    const response = await axios.post(`${BASE_URL}/api/users/login`, {
      email: uniqueTestUser.email,
      password: uniqueTestUser.password
    });
    
    if (response.data.success) {
      logInfo('用户登录测试通过', { userId: response.data.data.user.id });
      return response.data.data.token; // 返回令牌用于后续测试
    } else {
      logError('用户登录测试失败', { message: response.data.message });
      return null;
    }
  } catch (error) {
    logError('用户登录测试出错', { error: error.message });
    return null;
  }
}

/**
 * 测试获取当前用户信息
 */
async function testGetCurrentUser(token) {
  try {
    logInfo('开始测试获取当前用户信息...');
    
    const response = await axios.get(`${BASE_URL}/api/users/me`, {
      headers: {
        'Authorization': `Bearer ${token}`
      }
    });
    
    if (response.data.success) {
      logInfo('获取当前用户信息测试通过', { userId: response.data.data.user.id });
      return true;
    } else {
      logError('获取当前用户信息测试失败', { message: response.data.message });
      return false;
    }
  } catch (error) {
    logError('获取当前用户信息测试出错', { error: error.message });
    return false;
  }
}

/**
 * 测试AI解梦
 */
async function testDreamInterpretation() {
  try {
    logInfo('开始测试AI解梦...');
    
    const response = await axios.post(`${BASE_URL}/api/dreams/interpret`, testDream);
    
    if (response.data.success) {
      logInfo('AI解梦测试通过');
      return true;
    } else {
      logError('AI解梦测试失败', { message: response.data.message });
      return false;
    }
  } catch (error) {
    logError('AI解梦测试出错', { error: error.message });
    return false;
  }
}

/**
 * 测试八字排盘
 */
async function testBaziCalculation() {
  try {
    logInfo('开始测试八字排盘...');
    
    const response = await axios.post(`${BASE_URL}/api/divination/bazi/calculate`, testBazi);
    
    if (response.data.success) {
      logInfo('八字排盘测试通过');
      return true;
    } else {
      logError('八字排盘测试失败', { message: response.data.message });
      return false;
    }
  } catch (error) {
    logError('八字排盘测试出错', { error: error.message });
    return false;
  }
}

/**
 * 测试塔罗牌占卜
 */
async function testTarotReading() {
  try {
    logInfo('开始测试塔罗牌占卜...');
    
    const response = await axios.post(`${BASE_URL}/api/divination/tarot/read`, testTarot);
    
    if (response.data.success) {
      logInfo('塔罗牌占卜测试通过');
      return true;
    } else {
      logError('塔罗牌占卜测试失败', { message: response.data.message });
      return false;
    }
  } catch (error) {
    logError('塔罗牌占卜测试出错', { error: error.message });
    return false;
  }
}

/**
 * 运行所有测试
 */
async function runAllTests() {
  try {
    logInfo('开始运行所有API测试...');
    
    // 测试用户注册
    const token = await testUserRegistration();
    
    if (token) {
      // 测试获取当前用户信息
      await testGetCurrentUser(token);
    }
    
    // 测试用户登录
    const loginToken = await testUserLogin();
    
    // 测试AI解梦
    await testDreamInterpretation();
    
    // 测试八字排盘
    await testBaziCalculation();
    
    // 测试塔罗牌占卜
    await testTarotReading();
    
    logInfo('所有API测试完成');
  } catch (error) {
    logError('运行API测试时出错', { error: error.message });
  }
}

// 如果直接运行此脚本，则执行测试
if (require.main === module) {
  runAllTests();
}

module.exports = {
  testUserRegistration,
  testUserLogin,
  testGetCurrentUser,
  testDreamInterpretation,
  testBaziCalculation,
  testTarotReading,
  runAllTests
};